home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Pascal Super Library
/
Pascal Super Library (CW International)(1997).bin
/
TURB_VIS
/
TCYBER25
/
COMMON.ZIP
/
VGA.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-10-20
|
23KB
|
211 lines
{
Turbo Vision CyberTools 2.5
(C) 1994 Steve Goldsmith
All Rights Reserved
}
{$I APP.INC} {$IFDEF UseDLL} LIBRARY VGA ;{$ELSE} UNIT VGA ;{$ENDIF} {$IFNDEF UseDLL} INTERFACE {$ENDIF} USES
{$IFDEF UseDLL} CYBERAPI , {$ENDIF} MEMORY ;{$IFNDEF UseDLL} CONST VGAATTRINDEX =$03c0 ;VGAATTRDATA =$03c1 ;
VGAATTRMODE =$10 ;VGAATTROVERSCAN =$11 ;VGAATTRCPENABLE =$12 ;VGAATTRHORZPELPAN =$13 ;VGAATTRCOLORSEL =$14 ;
VGAMISCOUTWRITE =$03c2 ;VGASEQINDEX =$03c4 ;VGASEQRESET =$00 ;VGASEQCLOCKMODE =$01 ;VGASEQMAPMASK =$02 ;
VGASEQCHRMAPSEL =$03 ;VGASEQMEMMODE =$04 ;VGADACPELMASK =$03c6 ;VGADACREAD =$03c7 ;VGADACWRITE =$03c8 ;
VGADACPELDATA =$03c9 ;VGAMISCOUTREAD =$03cc ;VGAGRAPHINDEX =$03ce ;VGAGRAPHRESET =$00 ;VGAGRAPHENABLE =$01 ;
VGAGRAPHCOLORCMP =$02 ;VGAGRAPHFUNCSEL =$03 ;VGAGRAPHREADMAP =$04 ;VGAGRAPHMODE =$05 ;VGAGRAPHMISC =$06 ;
VGAGRAPHDONTCARE =$07 ;VGAGRAPHBITMASK =$08 ;VGACRTINDEX =$03d4 ;VGACRTHORZTOTAL =$00 ;VGACRTHORZDISPEND =$01 ;
VGACRTSTARTHORZBLANK =$02 ;VGACRTENDHORZBLANK =$03 ;VGACRTSTARTHORZRESCAN =$04 ;VGACRTENDHORZRESCAN =$05 ;
VGACRTVERTTOTAL =$06 ;VGACRTOVERFLOW =$07 ;VGACRTVERTPELPAN =$08 ;VGACRTMAXSCANLINE =$09 ;VGACRTCURSTART =$0a ;
VGACRTCUREND =$0b ;VGACRTSTARTADDRHI =$0c ;VGACRTSTARTADDRLO =$0d ;VGACRTCURLOCHI =$0e ;VGACRTCURLOCLO =$0f ;
VGACRTSTARTVERTRESCAN =$10 ;VGACRTENDVERTRESCAN =$11 ;VGACRTVERTDISPEND =$12 ;VGACRTOFFSET =$13 ;VGACRTUNDERLINELOC =$14
;VGACRTSTARTVERTBLANK =$15 ;VGACRTENDVERTBLANK =$16 ;VGACRTMODECONTROL =$17 ;VGACRTLINECOMPARE =$18 ;VGACRTSTATUS =$03da
;VGARGBMAX =2 ;VGADACREGMAX =255 ;VGAPALETTESIZE =768 ;VGAPAGEOFSLOC :ARRAY [ 0 .. 7 ] OF WORD =($0000 , $0800 , $1000 ,
$1800 , $2000 , $2800 , $3000 , $3800 );VGAPAGELOCOFS :ARRAY [ 0 .. 7 ] OF WORD =($0000 , $1000 , $2000 , $3000 , $4000
, $5000 , $6000 , $7000 );VGASCRWIDTH =80 ;VGASCRSIZE25 =2000 ;VGASCRSIZE50 =4000 ;VGAMAXCHRTABLES =8 ;
VGAMAXCHRHEIGHT =32 ;VGAMAXCHRS =256 ;VGACHRTABLESIZE =8192 ;VGAROM8X14 =2 ;VGAROM8X8 =3 ;VGAROMALT8X8 =4 ;
VGAROMALT9X14 =5 ;VGAROM8X16 =6 ;VGAROMALT9X16 =7 ;VGACHRTABLELOCOFS :ARRAY [ 0 .. 7 ] OF WORD =($0000 , $4000 , $8000 ,
$c000 , $2000 , $6000 , $a000 , $e000 );VGACHRTABLEMAP1 :ARRAY [ 0 .. 7 ] OF BYTE =($00 , 01 , $02 , $03 , $10 , $11 ,
$12 , $13 );VGACHRTABLEMAP2 :ARRAY [ 0 .. 7 ] OF BYTE =($00 , $04 , $08 , $0c , $20 , $24 , $28 , $2c );
VGABITTABLE :ARRAY [ 0 .. 7 ] OF BYTE =(128 , 64 , 32 , 16 , 8 , 4 , 2 , 1 );VGANOCARD =0 ;VGAMDAMDA =1 ;VGACGACGA =2 ;
VGAEGAEGA =4 ;VGAEGAMDA =5 ;VGAVGAMONO =7 ;VGAVGACOLOR =8 ;VGAMCGACGA =10 ;VGAMCGAMONO =11 ;VGAMCGACOLOR =12 ;
VGADATABUFMAX =65519 ;VGASCR256LINE =320 ;TYPE VGADATABUFPTR =^VGADATABUF ;VGADATABUF =ARRAY [ 0 .. VGADATABUFMAX ]
OF BYTE ;VGAPALETTEPTR =^VGAPALETTE ;VGAPALETTE =ARRAY [ 0 .. VGADACREGMAX , 0 .. VGARGBMAX ] OF BYTE ;
VGACHRTABLEPTR =^VGACHRTABLE ;VGACHRTABLE =ARRAY [ 0 .. VGACHRTABLESIZE - 1 ] OF BYTE ;VGALINE256 =ARRAY [ 0 .. 319 ]
OF BYTE ;VGASCREEN256 =ARRAY [ 0 .. 199 ] OF VGALINE256 ;PROCEDURE SETSEQCONT (INDEXREG ,DATAREG:BYTE );
FUNCTION GETSEQCONT (INDEXREG :BYTE ):BYTE ;PROCEDURE SETCRTCONT (INDEXREG ,DATAREG:BYTE );FUNCTION GETCRTCONT
(INDEXREG :BYTE ):BYTE ;PROCEDURE SETGRAPHCONT (INDEXREG ,DATAREG:BYTE );FUNCTION GETGRAPHCONT (INDEXREG :BYTE ):BYTE ;
PROCEDURE SETATTRCONT (INDEXREG ,DATAREG:BYTE );FUNCTION GETATTRCONT (INDEXREG :BYTE ):BYTE ;PROCEDURE SETMISCOUTPUT
(DATAREG :BYTE );FUNCTION GETMISCOUTPUT :BYTE ;PROCEDURE WAITVERTSYNC ;PROCEDURE WAITDISPENABLE ;PROCEDURE SETCHRWIDTH8 ;
PROCEDURE SETCHRWIDTH9 ;FUNCTION ISCHRWIDTH9 :BOOLEAN ;PROCEDURE SETPAGE (STARTOFS :WORD );PROCEDURE COPYSCRMEM
(SRC ,DEST:POINTER ;LEN :WORD );PROCEDURE SETDAC (REGNUM ,R,G,B:BYTE );PROCEDURE GETDAC (REGNUM :BYTE ;
VAR R ,G,B:BYTE );PROCEDURE SETDACBLOCK (PALPTR :POINTER ;STARTREG ,REGCNT:WORD );PROCEDURE GETDACBLOCK
(PALPTR :POINTER ;STARTREG ,REGCNT:WORD );PROCEDURE FADEOUTDAC (FADEINC :BYTE );PROCEDURE FADEINDAC
(DEFPAL :VGAPALETTEPTR ;FADEINC :BYTE );PROCEDURE ACCESSFONTMEM ;PROCEDURE ACCESSSCREENMEM ;PROCEDURE FONTMAPSELECT
(FONT1 ,FONT2:BYTE );PROCEDURE FONTMAPVAL (MAPSEL :BYTE ;VAR FONT1 ,FONT2:BYTE );PROCEDURE FONTTABLELOC (MAPSEL :BYTE ;
VAR FONT1PTR ,FONT2PTR:POINTER );PROCEDURE SETRAMTABLE (STARTCHR ,TOTALCHRS,HEIGHT:WORD ;
BUFADDR ,CHRADDR:VGACHRTABLEPTR );FUNCTION GETRAMTABLE (STARTCHR ,TOTALCHRS,HEIGHT:WORD ;
CHRADDR :VGACHRTABLEPTR ):VGACHRTABLEPTR ;PROCEDURE SETTABLEPIX (X ,Y,XLEN,HEIGHT:WORD ;CHRADDR :VGACHRTABLEPTR ;
PIXON :BOOLEAN );PROCEDURE DRAWTABLELINE (X1 ,Y1,X2,Y2,XLEN,HEIGHT:INTEGER ;CHRADDR :VGACHRTABLEPTR ;PIXON :BOOLEAN );
PROCEDURE DRAWTABLEELLIPSE (XC ,YC,A,B,XLEN,HEIGHT:INTEGER ;CHRADDR :VGACHRTABLEPTR ;PIXON :BOOLEAN );
FUNCTION VGACARDACTIVE :BOOLEAN ;PROCEDURE BIOSSETVIDEO (MODE :BYTE );PROCEDURE BIOSSETPALREG (REGNUM ,REGDATA:BYTE );
FUNCTION BIOSGETPALREG (REGNUM :BYTE ):BYTE ;PROCEDURE BIOSSETDAC (REGNUM ,R,G,B:BYTE );PROCEDURE BIOSGETDAC
(REGNUM :BYTE ;VAR R ,G,B:BYTE );PROCEDURE BIOSSETDACBLOCK (PALPTR :POINTER ;STARTREG ,REGCNT:WORD );
PROCEDURE BIOSGETDACBLOCK (PALPTR :POINTER ;STARTREG ,REGCNT:WORD );PROCEDURE BIOSFONTMAPSELECT (FONT1 ,FONT2:BYTE );
FUNCTION BIOSGETCHRHEIGHT :BYTE ;FUNCTION BIOSGETROMTABLEPTR (INFO :BYTE ):POINTER ;FUNCTION BIOSCOPYROMTABLE
(INFO :BYTE ):VGACHRTABLEPTR ;PROCEDURE BIOSSETCHRTABLE (CHRTABLE :BYTE );PROCEDURE BIOSLOADFONT (CHRDATA :POINTER ;
CHRTABLE ,CHRHEIGHT:BYTE ;STARTCHR ,NUMCHRS:WORD );PROCEDURE BIOSSETFONT (CHRDATA :POINTER ;CHRTABLE ,CHRHEIGHT:BYTE ;
STARTCHR ,NUMCHRS:WORD );PROCEDURE BIOSLOAD8X8FONT (CHRTABLE :BYTE );PROCEDURE BIOSLOAD8X14FONT (CHRTABLE :BYTE );
PROCEDURE BIOSLOAD8X16FONT (CHRTABLE :BYTE );PROCEDURE BIOSSET8X8FONT (CHRTABLE :BYTE );PROCEDURE BIOSSET8X14FONT
(CHRTABLE :BYTE );PROCEDURE BIOSSET8X16FONT (CHRTABLE :BYTE );PROCEDURE MOUSETEXTMASK (ANDMASK ,XORMASK:WORD );{$ENDIF}
VAR VGAPAGELOC :ARRAY [ 0 .. 7 ] OF POINTER ;VGACHRTABLELOC :ARRAY [ 0 .. 7 ] OF POINTER ;{$IFNDEF UseDLL}
IMPLEMENTATION {$ENDIF}PROCEDURE SETSEQCONT (INDEXREG,DATAREG:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
MOV DX , VGASEQINDEX{} MOV AL , INDEXREG{} MOV AH , DATAREG{} OUT DX , AX {} END;FUNCTION GETSEQCONT (INDEXREG:BYTE):BYTE
;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGASEQINDEX{} MOV AL , INDEXREG{} OUT DX , AL {} INC DX {}
IN AL , DX {} END;PROCEDURE SETCRTCONT (INDEXREG,DATAREG:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
MOV DX , VGACRTINDEX{} MOV AL , INDEXREG{} MOV AH , DATAREG{} OUT DX , AX {} END;FUNCTION GETCRTCONT (INDEXREG:BYTE):BYTE
;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGACRTINDEX{} MOV AL , INDEXREG{} OUT DX , AL {} INC DX {}
IN AL , DX {} END;PROCEDURE SETGRAPHCONT (INDEXREG,DATAREG:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
MOV DX , VGAGRAPHINDEX{} MOV AL , INDEXREG{} MOV AH , DATAREG{} OUT DX , AX {} END;FUNCTION GETGRAPHCONT
(INDEXREG:BYTE):BYTE ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGAGRAPHINDEX{} MOV AL , INDEXREG{}
OUT DX , AL {} INC DX {} IN AL , DX {} END;PROCEDURE SETATTRCONT (INDEXREG,DATAREG:BYTE);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}ASSEMBLER;ASM {} CALL WAITVERTSYNC{} MOV DX , VGAATTRINDEX{} MOV AL , INDEXREG{} OUT DX , AL {}
MOV AL , DATAREG{} OUT DX , AL {} MOV DX , VGACRTSTATUS{} IN AL , DX {} MOV DX , VGAATTRINDEX{} MOV AL , 20h {}
OUT DX , AL {} CALL WAITDISPENABLE{} END;FUNCTION GETATTRCONT (INDEXREG:BYTE):BYTE ;{$IFDEF UseDLL}EXPORT ;
{$ENDIF}ASSEMBLER;ASM {} CALL WAITVERTSYNC{} MOV DX , VGAATTRINDEX{} MOV AL , INDEXREG{} OUT DX , AL {}
MOV DX , VGAATTRDATA{} IN AL , DX {} XCHG AL , AH {} MOV DX , VGACRTSTATUS{} IN AL , DX {} MOV DX , VGAATTRINDEX{}
MOV AL , 20h {} OUT DX , AL {} CALL WAITDISPENABLE{} XCHG AL , AH {} END;PROCEDURE SETMISCOUTPUT (DATAREG:BYTE);
{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGAMISCOUTWRITE{} MOV AL , DATAREG{} OUT DX , AL {} END;
FUNCTION GETMISCOUTPUT :BYTE ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGAMISCOUTREAD{} IN AL , DX {}
END;PROCEDURE WAITVERTSYNC ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV DX , VGACRTSTATUS{} @rep1 : {}
IN AL , DX {} TEST AL , 08h {} JZ @rep1 {} END;PROCEDURE WAITDISPENABLE ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
MOV DX , VGACRTSTATUS{} @rep1 : {} IN AL , DX {} TEST AL , 08h {} JNZ @rep1 {} END;PROCEDURE SETCHRWIDTH8 ;
{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN SETMISCOUTPUT (GETMISCOUTPUT AND $f3 );SETSEQCONT (VGASEQRESET , $01 );SETSEQCONT
(VGASEQCLOCKMODE , $01 );SETSEQCONT (VGASEQRESET , $03 );SETATTRCONT (VGAATTRHORZPELPAN , $00 )END ;
PROCEDURE SETCHRWIDTH9 ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN SETMISCOUTPUT (GETMISCOUTPUT OR $04 );SETSEQCONT
(VGASEQRESET , $01 );SETSEQCONT (VGASEQCLOCKMODE , $00 );SETSEQCONT (VGASEQRESET , $03 );SETATTRCONT (VGAATTRHORZPELPAN ,
$08 )END ;FUNCTION ISCHRWIDTH9 :BOOLEAN ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN ISCHRWIDTH9 := (GETMISCOUTPUT AND $0c )=$04
END ;PROCEDURE SETPAGE (STARTOFS:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV BL , VGACRTSTARTADDRLO{}
MOV BH , BYTE PTR STARTOFS{} MOV CL , VGACRTSTARTADDRHI{} MOV CH , BYTE PTR STARTOFS+ 1 {} CALL WAITDISPENABLE{}
MOV DX , VGACRTINDEX{} MOV AX , BX {} OUT DX , AX {} MOV AX , CX {} OUT DX , AX {} END;PROCEDURE COPYSCRMEM
(SRC,DEST:POINTER;LEN:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} PUSH DS {} LDS SI , SRC{} LES DI , DEST{}
MOV CX , LEN{} CLD {} REP MOVSW {} POP DS {} END;PROCEDURE SETDAC (REGNUM,R,G,B:BYTE);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}ASSEMBLER;ASM {} CALL WAITVERTSYNC{} MOV DX , VGADACWRITE{} MOV AL , REGNUM{} OUT DX , AL {} INC DX {}
MOV AL , R{} OUT DX , AL {} MOV AL , G{} OUT DX , AL {} MOV AL , B{} OUT DX , AL {} CALL WAITDISPENABLE{} END;
PROCEDURE GETDAC (REGNUM:BYTE;VAR R,G,B:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} CALL WAITVERTSYNC{}
MOV DX , VGADACREAD{} MOV AL , REGNUM{} OUT DX , AL {} MOV DX , VGADACPELDATA{} IN AL , DX {} LES DI , R{}
MOV ES : [ DI ] , AL {} IN AL , DX {} LES DI , G{} MOV ES : [ DI ] , AL {} IN AL , DX {} LES DI , B{}
MOV ES : [ DI ] , AL {} CALL WAITDISPENABLE{} END;PROCEDURE SETDACBLOCK (PALPTR:POINTER;STARTREG,REGCNT:WORD);
{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} LES SI , PALPTR{} MOV BL , 3 {} MOV AX , STARTREG{}
MOV DX , VGADACWRITE{} OUT DX , AL {} @rep1 : {} MOV CX , REGCNT{} CALL WAITVERTSYNC{} MOV DX , VGADACPELDATA{}
@rep2 : {} MOV AL , ES : [ SI ] {} OUT DX , AL {} INC SI {} LOOP @rep2 {} CALL WAITDISPENABLE{} DEC BL {} JNZ @rep1 {}
END;PROCEDURE GETDACBLOCK (PALPTR:POINTER;STARTREG,REGCNT:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
LES SI , PALPTR{} MOV BL , 3 {} MOV AX , STARTREG{} MOV DX , VGADACREAD{} OUT DX , AL {} @rep1 : {} MOV CX , REGCNT{}
CALL WAITVERTSYNC{} MOV DX , VGADACPELDATA{} @rep2 : {} IN AL , DX {} MOV ES : [ SI ] , AL {} INC SI {} LOOP @rep2 {}
CALL WAITDISPENABLE{} DEC BL {} JNZ @rep1 {} END;PROCEDURE FADEOUTDAC (FADEINC:BYTE);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}VAR O10100I1l0l1I:BOOLEAN;OI10Illl01l,OI11I0I0ll0:BYTE;OI11l0101I0:VGAPALETTE;BEGIN GETDACBLOCK (@ OI11l0101I0 ,
0 , 256 );REPEAT O10100I1l0l1I := TRUE ;FOR OI11I0I0ll0 := 0 TO VGADACREGMAX DO FOR OI10Illl01l := 0 TO VGARGBMAX DO IF
OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] >= FADEINC THEN BEGIN DEC (OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] , FADEINC
);O10100I1l0l1I := FALSE END ELSE OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] := 0 ;SETDACBLOCK (@ OI11l0101I0 , 0 , 256
)UNTIL O10100I1l0l1I END ;PROCEDURE FADEINDAC (DEFPAL:VGAPALETTEPTR;FADEINC:BYTE);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}VAR O10100I1l0l1I:BOOLEAN;OI10Illl01l,OI11I0I0ll0:BYTE;OI11l0101I0:VGAPALETTE;BEGIN GETDACBLOCK (@ OI11l0101I0 ,
0 , 256 );REPEAT O10100I1l0l1I := TRUE ;FOR OI11I0I0ll0 := 0 TO VGADACREGMAX DO FOR OI10Illl01l := 0 TO VGARGBMAX DO IF
OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] <= DEFPAL ^[ OI11I0I0ll0 , OI10Illl01l ] - FADEINC THEN BEGIN INC (OI11l0101I0
[ OI11I0I0ll0 , OI10Illl01l ] , FADEINC );O10100I1l0l1I := FALSE END ELSE OI11l0101I0 [ OI11I0I0ll0 , OI10Illl01l ] :=
DEFPAL ^[ OI11I0I0ll0 , OI10Illl01l ] ;SETDACBLOCK (@ OI11l0101I0 , 0 , 256 )UNTIL O10100I1l0l1I END ;
PROCEDURE ACCESSFONTMEM ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN ASM {} PUSHF {} CLI {} END;SETSEQCONT (VGASEQMEMMODE , $07
);SETGRAPHCONT (VGAGRAPHREADMAP , $02 );SETGRAPHCONT (VGAGRAPHMODE , $00 );SETGRAPHCONT (VGAGRAPHMISC , $04 );SETSEQCONT
(VGASEQMAPMASK , $04 );ASM {} POPF {} END END ;PROCEDURE ACCESSSCREENMEM ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN ASM {}
PUSHF {} CLI {} END;SETSEQCONT (VGASEQMAPMASK , $03 );SETSEQCONT (VGASEQMEMMODE , $03 );SETGRAPHCONT (VGAGRAPHREADMAP ,
$00 );SETGRAPHCONT (VGAGRAPHMODE , $10 );SETGRAPHCONT (VGAGRAPHMISC , $0e );ASM {} POPF {} END END ;
PROCEDURE FONTMAPSELECT (FONT1,FONT2:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN SETSEQCONT (VGASEQCHRMAPSEL , FONT1 OR
FONT2 )END ;PROCEDURE FONTMAPVAL (MAPSEL:BYTE;VAR FONT1,FONT2:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}BEGIN FONT1 :=
((MAPSEL AND $10 )SHR 2 )OR (MAPSEL AND $03 );FONT2 := ((MAPSEL AND $20 )SHR 3 )OR ((MAPSEL AND $0c )SHR 2 )END ;
PROCEDURE FONTTABLELOC (MAPSEL:BYTE;VAR FONT1PTR,FONT2PTR:POINTER);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}VAR OI1I1lIII0l1,Ol001O10llII:BYTE;BEGIN FONTMAPVAL (MAPSEL , OI1I1lIII0l1 , Ol001O10llII );FONT1PTR :=
VGACHRTABLELOC [ OI1I1lIII0l1 ] ;FONT2PTR := VGACHRTABLELOC [ Ol001O10llII ] END ;PROCEDURE SETRAMTABLE
(STARTCHR,TOTALCHRS,HEIGHT:WORD;BUFADDR,CHRADDR:VGACHRTABLEPTR);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}VAR O1lI0111OIIl,OI110Il1III1:WORD;BEGIN FOR O1lI0111OIIl := 0 TO TOTALCHRS - 1 DO FOR OI110Il1III1 := 0 TO
HEIGHT - 1 DO CHRADDR ^[ (O1lI0111OIIl + STARTCHR )* VGAMAXCHRHEIGHT + OI110Il1III1 ] := BUFADDR ^[ O1lI0111OIIl *
HEIGHT + OI110Il1III1 ] END ;FUNCTION GETRAMTABLE (STARTCHR,TOTALCHRS,HEIGHT:WORD;CHRADDR:VGACHRTABLEPTR):VGACHRTABLEPTR
;{$IFDEF UseDLL}EXPORT ;{$ENDIF}VAR O1lI0111OIIl,OI110Il1III1:WORD;OOlIIO1O1OO0:VGACHRTABLEPTR;BEGIN OOlIIO1O1OO0 :=
MEMALLOC (HEIGHT * TOTALCHRS );IF OOlIIO1O1OO0 <> NIL THEN BEGIN FOR O1lI0111OIIl := 0 TO TOTALCHRS - 1
DO FOR OI110Il1III1 := 0 TO HEIGHT - 1 DO OOlIIO1O1OO0 ^[ O1lI0111OIIl * HEIGHT + OI110Il1III1 ] := CHRADDR ^[
(O1lI0111OIIl + STARTCHR )* VGAMAXCHRHEIGHT + OI110Il1III1 ] END ;GETRAMTABLE := OOlIIO1O1OO0 END ;PROCEDURE SETTABLEPIX
(X,Y,XLEN,HEIGHT:WORD;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}VAR O1lI0111OIIl,OI110Il1III1:WORD;BEGIN O1lI0111OIIl := (X SHR 3 )+ (Y DIV HEIGHT * XLEN );OI110Il1III1 := Y MOD
HEIGHT ;IF PIXON THEN CHRADDR ^[ O1lI0111OIIl * VGAMAXCHRHEIGHT + OI110Il1III1 ] := CHRADDR ^[ O1lI0111OIIl *
VGAMAXCHRHEIGHT + OI110Il1III1 ] OR VGABITTABLE [ (X AND 7 )] ELSE CHRADDR ^[ O1lI0111OIIl * VGAMAXCHRHEIGHT +
OI110Il1III1 ] := CHRADDR ^[ O1lI0111OIIl * VGAMAXCHRHEIGHT + OI110Il1III1 ] AND NOT VGABITTABLE [ (X AND 7 )] END ;
PROCEDURE DRAWTABLELINE (X1,Y1,X2,Y2,XLEN,HEIGHT:INTEGER;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}VAR O1I10Ol1,O1I1Il0I,OOIO,OOIl,O10OI1l0O0I0l,O10OI1l0O0I10,OIOI,OO1I:INTEGER;BEGIN O10OI1l0O0I0l := 1 ;O1I10Ol1
:= X2 - X1 ;IF O1I10Ol1 < 0 THEN BEGIN O10OI1l0O0I0l := - 1 ;O1I10Ol1 := - O1I10Ol1 END ;O1I1Il0I := Y2 - Y1 ;IF O1I1Il0I
< 0 THEN BEGIN O10OI1l0O0I10 := - 1 ;O1I1Il0I := - O1I1Il0I END ELSE IF O1I1Il0I > 0 THEN O10OI1l0O0I10 := 1 ELSE
O10OI1l0O0I10 := 0 ;OOIO := X1 ;OOIl := Y1 ;SETTABLEPIX (OOIO , OOIl , XLEN , HEIGHT , CHRADDR , PIXON );IF O1I10Ol1 >
O1I1Il0I THEN BEGIN OO1I := O1I10Ol1 SHR 1 ;FOR OIOI := 1 TO O1I10Ol1 DO BEGIN OOIO := OOIO + O10OI1l0O0I0l ;OO1I :=
OO1I + O1I1Il0I ;IF OO1I >= O1I10Ol1 THEN BEGIN OOIl := OOIl + O10OI1l0O0I10 ;OO1I := OO1I - O1I10Ol1 END ;SETTABLEPIX
(OOIO , OOIl , XLEN , HEIGHT , CHRADDR , PIXON )END END ELSE BEGIN OO1I := O1I1Il0I SHR 1 ;FOR OIOI := 1 TO O1I1Il0I
DO BEGIN OOIl := OOIl + O10OI1l0O0I10 ;OO1I := OO1I + O1I10Ol1 ;IF OO1I >= O1I1Il0I THEN BEGIN OOIO := OOIO +
O10OI1l0O0I0l ;OO1I := OO1I - O1I1Il0I END ;SETTABLEPIX (OOIO , OOIl , XLEN , HEIGHT , CHRADDR , PIXON )END END END ;
PROCEDURE DRAWTABLEELLIPSE (XC,YC,A,B,XLEN,HEIGHT:INTEGER;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}VAR OOIO,OOIl:INTEGER;O101OO10,O1OI0OlO010,OOlI0O1OII10,O10I0OII,O1OI0l000II,OOlI1IIOOOl1,OI11l00O1I0:LONGINT;
BEGIN O101OO10 := LONGINT (A )* A ;O10I0OII := LONGINT (B )* B ;O1OI0OlO010 := O101OO10 SHL 1 ;O1OI0l000II := O10I0OII
SHL 1 ;OOIO := 0 ;OOIl := B ;OOlI1IIOOOl1 := 0 ;OOlI0O1OII10 := OOIl * O1OI0OlO010 ;OI11l00O1I0 := - OOIl * O101OO10 ;
WHILE OOlI1IIOOOl1 <= OOlI0O1OII10 DO BEGIN SETTABLEPIX (XC + OOIO , YC + OOIl , XLEN , HEIGHT , CHRADDR , PIXON );
SETTABLEPIX (XC + OOIO , YC - OOIl , XLEN , HEIGHT , CHRADDR , PIXON );SETTABLEPIX (XC - OOIO , YC + OOIl , XLEN , HEIGHT
, CHRADDR , PIXON );SETTABLEPIX (XC - OOIO , YC - OOIl , XLEN , HEIGHT , CHRADDR , PIXON );INC (OOIO );OOlI1IIOOOl1 :=
OOlI1IIOOOl1 + O1OI0l000II ;OI11l00O1I0 := OI11l00O1I0 + OOlI1IIOOOl1 - O10I0OII ;IF OI11l00O1I0 >= 0 THEN BEGIN DEC
(OOIl );OOlI0O1OII10 := OOlI0O1OII10 - O1OI0OlO010 ;OI11l00O1I0 := OI11l00O1I0 - OOlI0O1OII10 END END ;OOIO := A ;OOIl :=
0 ;OOlI1IIOOOl1 := OOIO * O1OI0l000II ;OOlI0O1OII10 := 0 ;OI11l00O1I0 := - OOIO * O10I0OII ;WHILE OOlI1IIOOOl1 >
OOlI0O1OII10 DO BEGIN SETTABLEPIX (XC + OOIO , YC + OOIl , XLEN , HEIGHT , CHRADDR , PIXON );SETTABLEPIX (XC + OOIO , YC
- OOIl , XLEN , HEIGHT , CHRADDR , PIXON );SETTABLEPIX (XC - OOIO , YC + OOIl , XLEN , HEIGHT , CHRADDR , PIXON );
SETTABLEPIX (XC - OOIO , YC - OOIl , XLEN , HEIGHT , CHRADDR , PIXON );INC (OOIl );OOlI0O1OII10 := OOlI0O1OII10 +
O1OI0OlO010 ;OI11l00O1I0 := OI11l00O1I0 + OOlI0O1OII10 - O101OO10 ;IF OI11l00O1I0 >= 0 THEN BEGIN DEC (OOIO );
OOlI1IIOOOl1 := OOlI1IIOOOl1 - O1OI0l000II ;OI11l00O1I0 := OI11l00O1I0 - OOlI1IIOOOl1 END END END ;
FUNCTION VGACARDACTIVE :BOOLEAN ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1a00h {} INT 10h {}
XCHG AL , AH {} SUB AL , AL {} CMP AH , 1ah {} JNZ @endif1 {} CMP BL , VGAVGACOLOR{} JNZ @endif1 {} INC AL {}
@endif1 : {} END;PROCEDURE BIOSSETVIDEO (MODE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} SUB AH , AH {}
MOV AL , MODE{} INT 10h {} END;PROCEDURE BIOSSETPALREG (REGNUM,REGDATA:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;
ASM {} MOV AX , 1000h {} MOV BH , REGDATA{} MOV BL , REGNUM{} INT 10h {} END;FUNCTION BIOSGETPALREG (REGNUM:BYTE):BYTE ;
{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV BL , REGNUM{} MOV AX , 1007h {} INT 10h {} MOV AL , BH {} END;
PROCEDURE BIOSSETDAC (REGNUM,R,G,B:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} XOR BH , BH {} MOV BL , REGNUM{}
MOV AX , 1010h {} MOV DH , R{} MOV CH , G{} MOV CL , B{} INT 10h {} END;PROCEDURE BIOSGETDAC (REGNUM:BYTE;
VAR R,G,B:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} XOR BH , BH {} MOV BL , REGNUM{} MOV AX , 1015h {}
INT 10h {} LES DI , R{} MOV ES : [ DI ] , DH {} LES DI , G{} MOV ES : [ DI ] , CH {} LES DI , B{} MOV ES : [ DI ] , CL {}
END;PROCEDURE BIOSSETDACBLOCK (PALPTR:POINTER;STARTREG,REGCNT:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {}
MOV AX , 1012h {} MOV BX , STARTREG{} MOV CX , REGCNT{} LES DX , PALPTR{} INT 10h {} END;PROCEDURE BIOSGETDACBLOCK
(PALPTR:POINTER;STARTREG,REGCNT:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1017h {}
MOV BX , STARTREG{} MOV CX , REGCNT{} LES DX , PALPTR{} INT 10h {} END;PROCEDURE BIOSFONTMAPSELECT (FONT1,FONT2:BYTE);
{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1103h {} MOV BL , FONT1{} OR BL , FONT2{} INT 10h {} END;
FUNCTION BIOSGETCHRHEIGHT :BYTE ;{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1130h {} MOV BH , 6 {}
PUSH BP {} INT 10h {} POP BP {} MOV AX , CX {} END;FUNCTION BIOSGETROMTABLEPTR (INFO:BYTE):POINTER ;
{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1130h {} MOV BH , INFO{} PUSH BP {} INT 10h {} MOV AX , BP {}
POP BP {} MOV DX , ES {} END;FUNCTION BIOSCOPYROMTABLE (INFO:BYTE):VGACHRTABLEPTR ;{$IFDEF UseDLL}EXPORT ;
{$ENDIF}VAR OIl0OII10lI:WORD;OI11I1l0lII,OIlI1OlO00I:VGACHRTABLEPTR;BEGIN OI11I1l0lII := BIOSGETROMTABLEPTR (INFO );
OIlI1OlO00I := NIL ;CASE INFO OF VGAROM8X8 :OIl0OII10lI := 8 ;VGAROMALT8X8 :OIl0OII10lI := 8 ;VGAROM8X14 :OIl0OII10lI :=
14 ;VGAROMALT9X14 :OIl0OII10lI := 14 ;VGAROM8X16 :OIl0OII10lI := 16 ;VGAROMALT9X16 :OIl0OII10lI := 16 END ;OIlI1OlO00I :=
MEMALLOC (OIl0OII10lI * VGAMAXCHRS );IF OIlI1OlO00I <> NIL THEN MOVE (OI11I1l0lII ^, OIlI1OlO00I ^, OIl0OII10lI *
VGAMAXCHRS );BIOSCOPYROMTABLE := OIlI1OlO00I END ;PROCEDURE BIOSSETCHRTABLE (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;
{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1103h {} MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSLOADFONT (CHRDATA:POINTER;
CHRTABLE,CHRHEIGHT:BYTE;STARTCHR,NUMCHRS:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1100h {}
MOV BH , CHRHEIGHT{} MOV BL , CHRTABLE{} MOV CX , NUMCHRS{} MOV DX , STARTCHR{} LES SI , CHRDATA{} PUSH BP {}
MOV BP , SI {} INT 10h {} POP BP {} END;PROCEDURE BIOSSETFONT (CHRDATA:POINTER;CHRTABLE,CHRHEIGHT:BYTE;
STARTCHR,NUMCHRS:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1110h {} MOV BH , CHRHEIGHT{}
MOV BL , CHRTABLE{} MOV CX , NUMCHRS{} MOV DX , STARTCHR{} LES SI , CHRDATA{} PUSH BP {} MOV BP , SI {} INT 10h {}
POP BP {} END;PROCEDURE BIOSLOAD8X8FONT (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1102h {}
MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSLOAD8X14FONT (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;
ASM {} MOV AX , 1101h {} MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSLOAD8X16FONT (CHRTABLE:BYTE);
{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1104h {} MOV BL , CHRTABLE{} INT 10h {} END;
PROCEDURE BIOSSET8X8FONT (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1112h {}
MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSSET8X14FONT (CHRTABLE:BYTE);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;
ASM {} MOV AX , 1111h {} MOV BL , CHRTABLE{} INT 10h {} END;PROCEDURE BIOSSET8X16FONT (CHRTABLE:BYTE);
{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 1114h {} MOV BL , CHRTABLE{} INT 10h {} END;
PROCEDURE MOUSETEXTMASK (ANDMASK,XORMASK:WORD);{$IFDEF UseDLL}EXPORT ;{$ENDIF}ASSEMBLER;ASM {} MOV AX , 0ah {}
SUB BX , BX {} MOV CX , ANDMASK{} MOV DX , XORMASK{} INT 33h {} END;PROCEDURE O1l0OI1llOO0 ;VAR OIlO:BYTE;BEGIN FOR OIlO
:= 0 TO 7 DO BEGIN VGAPAGELOC [ OIlO ] := PTR (SEGB800 , VGAPAGELOCOFS [ OIlO ] );VGACHRTABLELOC [ OIlO ] := PTR
(SEGA000 , VGACHRTABLELOCOFS [ OIlO ] )END END ;{$IFDEF UseDLL}EXPORTS SETSEQCONT , GETSEQCONT , SETCRTCONT , GETCRTCONT
, SETGRAPHCONT , GETGRAPHCONT , SETATTRCONT , GETATTRCONT , SETMISCOUTPUT , GETMISCOUTPUT , WAITVERTSYNC , WAITDISPENABLE
, SETCHRWIDTH8 , SETCHRWIDTH9 , ISCHRWIDTH9 , SETPAGE , COPYSCRMEM , SETDAC , GETDAC , SETDACBLOCK , GETDACBLOCK ,
FADEOUTDAC , FADEINDAC , ACCESSFONTMEM , ACCESSSCREENMEM , FONTMAPSELECT , FONTMAPVAL , FONTTABLELOC , SETRAMTABLE ,
GETRAMTABLE , SETTABLEPIX , DRAWTABLELINE , DRAWTABLEELLIPSE , VGACARDACTIVE , BIOSSETVIDEO , BIOSSETPALREG ,
BIOSGETPALREG , BIOSSETDAC , BIOSGETDAC , BIOSSETDACBLOCK , BIOSGETDACBLOCK , BIOSFONTMAPSELECT , BIOSGETCHRHEIGHT ,
BIOSGETROMTABLEPTR , BIOSCOPYROMTABLE , BIOSSETCHRTABLE , BIOSLOADFONT , BIOSSETFONT , BIOSLOAD8X8FONT , BIOSLOAD8X14FONT
, BIOSLOAD8X16FONT , BIOSSET8X8FONT , BIOSSET8X14FONT , BIOSSET8X16FONT , MOUSETEXTMASK ;{$ENDIF}BEGIN O1l0OI1llOO0 END.